package org.rkuk.kasutil.test 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import org.rkuk.kasutil.designPatternTools.AbstractTool;
	
	/**
	 * 用于创建并运行测试用例TestCase，TestBed可以作为Document Class生成swf直接运行.
	 * TestBed是抽象类，可以通过在其子类中override createTestCase方法创建测试用例。
	 * @author rkuk
	 * @see		org.rkuk.kasutil.test.TestCase
	 */
	public class TestBed extends Sprite 
	{
		/**
		 * 保存createTestCase方法创建的测试用例
		 */
		protected var testCase:TestCase;
		
		/**
		 * @private
		 */
		public function TestBed()
		{
			AbstractTool.makeAbstractClass(this, TestBed);
			if(stage)
				init();
			else
				addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		/**
		 * 创建测试用例，并执行测试用例的初始化.
		 * 当测试用例初始化完成时，会触发TestBed.onTestCaseReady函数。
		 * 一般不需要重载此方法，当需要改变测试用例的初始化时机或过程时，可以重载此方法。
		 */
		protected function init(e:Event = null):void
		{
			testCase = createTestCase();
			testCase.addEventListener(Event.INIT, onTestCaseReady);
			testCase.initialize();
		}
		
		/**
		 * 创建并返回相应的测试用例.
		 * 子类应该override此方法创建需要的测试用例以进行相关测试。
		 * @return	返回创建的测试用例
		 * @see		org.rkuk.kasutil.test.TestCase
		 */
		protected function createTestCase():TestCase
		{
			return AbstractTool.makeAbstractMethod(this, "createTestCase");
		}
		
		/**
		 * 当测试用例TestCase初始化完成发出Event.INIT事件时，执行此方法.
		 * 默认的执行的操作是调用TestCase的run方法。可以通过override此方法
		 * 改变测试用例运行的步骤。
		 * @param	e	TestCase发出的Event.INIT事件
		 * @see		org.rkuk.test.TestCase#run()
		 */
		protected function onTestCaseReady(e:Event):void
		{
			testCase.removeEventListener(Event.INIT, onTestCaseReady);
			testCase.run();
		}
	}
}